package com.yuandian.base.service.impl;

import cn.hutool.core.date.DateUtil;
import com.yuandian.base.mapper.TaskDataMapper;
import com.yuandian.base.service.ITaskDataService;
import com.yuandian.vo.TaskDataParams;
import com.yuandian.vo.TaskDataVo;
import com.yuandian.vo.TrendDataVo;
import com.yuandian.constant.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * <p>
 * 任务最新数据时间表Service实现类
 * <p>
 *
 * @author lijunhang
 * @date 2021/12/28
 * @since 1.0.0
 */
@Service
public class TaskDataServiceImpl implements ITaskDataService {

	@Autowired
	private TaskDataMapper taskDataMapper;

	/**
	 * 查询指定任务最新数据时间
	 *
	 * @param params 查询参数
	 * @return 返回趋势图数据
	 */
	@Override
	public TaskDataVo query(TaskDataParams params) {
		return taskDataMapper.query(params);
	}

	/**
	 * 重新构建趋势图结果对象，判断趋势图需要展示的最后一个点是哪个，不加工原本的趋势图数组
	 *
	 * @param taskName       趋势图对应的数据重组的任务名称
	 * @param queryStartTime 查询开始时间
	 * @param queryEndTime   查询的结束时间
	 * @param object         趋势数据
	 * @return 趋势图对象
	 */
//    @DS("bpmData")
	@Override
	public TrendDataVo getTrendObject(String taskName, String queryStartTime, String queryEndTime, Object object) {
		TaskDataParams params = new TaskDataParams();
		TrendDataVo trendDataVo = new TrendDataVo();
		params.setJobName(taskName);
		TaskDataVo taskDataVo = taskDataMapper.query(params);
		/**
		 * 1、如果任务最新数据时间表中，没有存在该任务的最新数据时间，则使用查询的结束时间
		 * 2、若能在任务最新数据时间表中查到
		 *     -若任务的最新数据时间大于或者等于查询的结束时间，则趋势图的结束时间取查询的结束时间，去掉最后一个趋势图的点
		 *     （此点代表查询的结束时间，查询的原则是左闭右开）
		 *     -若任务的最新数据时间小于查询的结束时间，则趋势图的结束时间取最新数据时间，此时要展示趋势图的最后一个点
		 *     （因为任务已经统计到了这个点，页面的查询时间也已经超过了这个时间点）
		 */
		if (taskDataVo != null) {
			String newestCycleTime = DateUtil.format(taskDataVo.getNewestCycleTime(), Constants.YYYY_MM_DD_HH_MM_SS);
			Date queryEndTimeDate = new Date();
			try {
				queryEndTimeDate = DateUtil.parse(queryEndTime, Constants.YYYY_MM_DD_HH_MM_SS);
			} catch (Exception e) {
				e.printStackTrace();
			}
			if (taskDataVo.getNewestCycleTime().getTime() >= queryEndTimeDate.getTime()) {
				trendDataVo.setTrendEndTime(queryEndTime);
				trendDataVo.setLastShow(false);
			} else {
				trendDataVo.setTrendEndTime(newestCycleTime);
				trendDataVo.setLastShow(true);
			}
		} else {
			trendDataVo.setTrendEndTime(queryEndTime);
		}

		trendDataVo.setTrendStartTime(queryStartTime);
		trendDataVo.setTrendData(object);
		return trendDataVo;
	}


}
